home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok24.lha / DME / SRC / source.zoo / main.c < prev    next >
C/C++ Source or Header  |  1989-07-03  |  26KB  |  983 lines

  1.  
  2. /*
  3.  * MAIN.C
  4.  *
  5.  *      (C)Copyright 1987 by Matthew Dillon, All Rights Reserved.
  6.  *
  7.  */
  8.  
  9. #include "defs.h"
  10. #include <local/deemu.h>
  11. #include <local/ipc.h>
  12.  
  13. short Deemu[] = {
  14.     DMSTRT,    0, 0,
  15.     DMNW,      0,10,0,0,0,0,0xFFFF,
  16.     'SC','R.', 0, 1,0x0200,
  17.     DMEND,     0, 0
  18. };
  19.  
  20. #define DMNWOFF   4
  21. #define DMSCREEN 17
  22.  
  23. #define IDCMPFLAGS   CLOSEWINDOW|NEWSIZE|RAWKEY|MOUSEBUTTONS|ACTIVEWINDOW|MOUSEMOVE|MENUPICK|GADGETUP|GADGETDOWN
  24.  
  25. extern SCR *OpenScreen();
  26. extern WIN *OpenWindow();
  27. extern char *menu_cmd();
  28. extern struct Gadget Gadget1;
  29.  
  30. NW Nw = {
  31.    0, 1, 0  , 0  , -1, -1,  /*  width, height filled in by program */
  32.    IDCMPFLAGS,
  33.    ACTIVATE|WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE|NOCAREREFRESH|RMBTRAP,
  34.    &Gadget1,
  35.    NULL, (ubyte *)"   WAIT   ",
  36.    NULL, NULL,
  37.    94, 47, -1, -1,
  38.    WBENCHSCREEN
  39. };
  40.  
  41. short Sharedrefs;
  42. short Oldtlen = 999;      /*  Old Title Length    */
  43. struct MsgPort *Sharedport;
  44. DISKOBJ *Do;
  45. WBS     *Wbs;
  46.  
  47. SCR *Screen = NULL;
  48.  
  49. WIN *Win;
  50. RP  *Rp;
  51.  
  52. short Xsize,  Ysize;            /* font character sizes        */
  53. short Rows,  Columns;           /* character rows/cols available       */
  54. short Xbase,  Ybase;            /* offset pixel base for display       */
  55. short XTbase,YTbase;            /* used for text display               */
  56. short Xpixs,  Ypixs;            /* actual # X/Y pixels available       */
  57. short Mx, My;
  58.  
  59. ubyte *av[8];
  60. char Quitflag;
  61. char Overide;
  62. char SizeOveride;
  63. char Wdisable = 1;              /* Disable icon save                   */
  64. char MShowTitle, MForceTitle;
  65. short Nwwidth, Nwheight, Nwtopedge, Nwleftedge, Nwtmpwidth, Nwtmpheight;
  66.  
  67. PORT *IPCPort;
  68. PORT *IPCRPort;
  69. long Mask;
  70.  
  71. int Enable_Abort;
  72.  
  73. extern WIN   *opensharedwindow();
  74.  
  75. static char *Ffile;
  76.  
  77. PROC *proc;
  78.  
  79. main(mac, mav)
  80. char *mav[];
  81. {
  82.     char nf, ni;            /*  # files on command line     */
  83.     char notdone;           /*  for endless loop            */
  84.     char iawm = 0;          /*  overide mouse buttons       */
  85.     char dontwait = 0;      /*  don't wait for a message    */
  86.     short i;
  87.     short Code;
  88.     long origlock;
  89.     struct IntuiMessage *gmess = NULL; /* used for gadget handling */
  90.  
  91.     proc = (PROC *)FindTask(NULL);
  92.  
  93.     origlock = CurrentDir(DupLock(proc->pr_CurrentDir));
  94.  
  95.     NewList(&DBase);
  96. #ifndef NO_DO2
  97.     NewList(&PBase);
  98. #endif
  99.     if (!openlibs(INTUITION_LIB|GRAPHICS_LIB))
  100.         exiterr("cannot open intuition or graphics library");
  101.     initipc();
  102.  
  103.     InitDeemuNW(Deemu+DMNWOFF, &Nw);
  104.  
  105.     ScreenDepth = (Deemu[DMSCREEN] >> 8);
  106.  
  107.     init_command();
  108.  
  109.     Nwwidth     = Nw.Width;     /*  Parameters for new windows  */
  110.     Nwheight    = Nw.Height;
  111.     Nwtopedge   = Nw.TopEdge;
  112.     Nwleftedge  = Nw.LeftEdge;
  113.  
  114.     Enable_Abort= 0;            /*  disable break               */
  115.  
  116.     String  = (char *)malloc(1);        /*  initialize scanf variable   */
  117.     *String = 0;
  118.  
  119.     if (mac == 0) {             /*  WORKBENCH STARTUP           */
  120.  
  121.         Wdisable = 0;           /*  allow icon save             */
  122.         Wbs = (WBS *)mav;
  123.         if (!openlibs(ICON_LIB))
  124.             exiterr("unable to open icon library");
  125.         UnLock(CurrentDir(DupLock(Wbs->sm_ArgList[0].wa_Lock)));   /* Tool */
  126.         Do = GetDiskObject(Wbs->sm_ArgList[0].wa_Name);
  127.         if (Do == NULL)
  128.             exiterr("unable to get disk object");
  129.         mac = 99;
  130.     }
  131.  
  132. #if AREXX
  133.     mountrequest(0);
  134.     openrexx();     /* do this after the last possible call to exiterr() */
  135.     mountrequest(1);
  136. #endif
  137.  
  138.     resethash();
  139.  
  140.     if (Do) {
  141.         ops(Do->do_ToolTypes, 1);
  142.         nf = Wbs->sm_NumArgs - 1;
  143.         UnLock(CurrentDir(DupLock(Wbs->sm_ArgList[0].wa_Lock)));
  144.     } else {
  145.         nf = ops(mav+1, 0);
  146.     }
  147.  
  148.     for (ni = 0, i = 1; i < mac; ++i) {
  149.         register char *str;
  150.         register DISKOBJ *dso;
  151.         if (Wbs) {
  152.             if (i > nf)
  153.                 break;
  154.             str = Wbs->sm_ArgList[i].wa_Name;
  155.             UnLock(CurrentDir(DupLock(Wbs->sm_ArgList[i].wa_Lock)));
  156.             if (dso = GetDiskObject(Wbs->sm_ArgList[i].wa_Name)) {
  157.                 ops(dso->do_ToolTypes, 1);
  158.                 FreeDiskObject(dso);
  159.             }
  160.         } else {
  161.             str = mav[i];
  162.             if (*str == '-')
  163.                 continue;
  164.         }
  165.         do_newwindow(nf > 1, ni * 11);
  166.         ++ni;
  167.         av[0] = (ubyte *)"newfile";
  168.         av[1] = (ubyte *)str;
  169.         {
  170.           long lock;
  171.           struct FileInfoBlock *fib;
  172.  
  173.           lock = Lock(str, SHARED_LOCK);
  174.           if(lock) {
  175.             fib = malloc(sizeof(struct FileInfoBlock));
  176.             Examine(lock,fib);
  177.             if(fib->fib_DirEntryType > 0) {
  178.               /* CurrentDir(lock); */
  179.               UnLock(Ep->dirlock);
  180.               Ep->dirlock = lock;
  181.               av[1] = (ubyte *) "unnamed";
  182.             } else
  183.               UnLock(lock);
  184.             free(fib);
  185.           }
  186.           do_edit();
  187.         }
  188.         MForceTitle = 1;
  189.         window_title();
  190.     }
  191.     if (nf == 0)                    /* no files to edit */
  192.         do_newwindow(nf > 1, ni * 10);
  193.  
  194.     mountrequest(0);
  195.     av[0] = NULL;
  196.     av[1] = (ubyte *)"s:.edrc";
  197.     do_source();
  198.     av[0] = NULL;
  199.     av[1] = (ubyte *)((Ffile) ? Ffile : ".edrc");
  200.     do_source();
  201.     mountrequest(1);
  202.     {                       /*  1.29c   */
  203.         register ED *ep;
  204.         register ED *eb = Ep;
  205.         if (eb) {
  206.             for (ep = (ED *)eb->Node.mln_Succ; ep->Node.mln_Succ; ep = (ED *)ep->Node.mln_Succ) {
  207.                 ep->Tabstop = eb->Tabstop;
  208.                 ep->Margin  = eb->Margin;
  209.                 ep->Insertmode = eb->Insertmode;
  210.                 ep->IgnoreCase = eb->IgnoreCase;
  211.                 ep->Wordwrap   = eb->Wordwrap;
  212.                 if (eb->Font) {
  213.                     ep->Font = eb->Font;
  214.                     ++eb->Font->tf_Accessors;
  215.                 }
  216.             }
  217.         }
  218.     }
  219.     title("DME V1.4 \251Copyright 1988 by Matthew Dillon,  All Rights Reserved                  ");
  220.     Mask |= 1 << Win->UserPort->mp_SigBit;
  221. loop:
  222.     if (!Ep->iconmode)
  223.         text_cursor(1);
  224.     for (notdone = 1; !Quitflag && notdone;) {
  225.         char mmove = 0;
  226.         short mqual;
  227.  
  228.         if (!Ep->iconmode)
  229.             window_title();
  230.         if (dontwait) {
  231.             --dontwait;
  232.         } else {
  233.             Wait(Mask);
  234.         }
  235.  
  236.         /*
  237.          *  NOTE: due to operation of breakcheck(), the userport signal
  238.          *  may not be set even if there are messages pending.
  239.          *
  240.          *  NOTE2: CheckPort() requires dres.library, which will be loaded
  241.          *  if IPCPort exists because the IPC needs it also.
  242.          */
  243.  
  244.         if (IPCPort && CheckPort(IPCPort))
  245.             ipchandler();
  246.         {
  247.             register IMESS *im;
  248.             while (im = (IMESS *)GetMsg(Win->UserPort)) {
  249.                 Msgchk = 1;
  250.                 Abortcommand = 0;
  251.                 Code = im->Code;
  252.                 if (im->IDCMPWindow != Win) {
  253.                     Overide = 0;
  254.                     if (Comlinemode)
  255.                         escapecomlinemode();
  256.                     text_sync();
  257.                     MShowTitle = 0;
  258.                     if (!Ep->iconmode)
  259.                         window_title();
  260.                     if (text_switch(im->IDCMPWindow) == 0) {
  261.                         ReplyMsg(im);
  262.                         continue;
  263.                     }
  264.                 }
  265.                 Mx = im->MouseX;
  266.                 My = im->MouseY;
  267.                 switch(im->Class) {
  268.                 case GADGETDOWN:
  269.                   gmess = im;
  270.                   break;
  271.                 case GADGETUP:
  272.                   gmess = NULL;
  273.                   break;
  274.                 case NEWSIZE:
  275.                     if (!Ep->iconmode) {
  276.                         if (Comlinemode)
  277.                             escapecomlinemode();
  278.                         set_window_params();
  279.                         if (!text_sync())
  280.                            text_redisplay();
  281.                         text_cursor(1);
  282.                     }
  283.                     break;
  284.                 case MOUSEBUTTONS:
  285.                     switch(Code) {
  286.                     case SELECTDOWN:
  287.                     case MENUDOWN:
  288.                         if (Ep->iconmode || iawm) {
  289.                             uniconify();
  290.                             break;
  291.                         }
  292.                         ReportMouse(-1, Win);
  293.                         uniconify();
  294.                         text_cursor(0);
  295.                         keyctl(NULL, im->Code|0x80, im->Qualifier);
  296.                         text_cursor(1);
  297.                         break;
  298.                     case SELECTUP:
  299.                     case MENUUP:
  300.                         ReportMouse(0, Win);
  301.                         break;
  302.                     }
  303.                     break;
  304.                 case RAWKEY:
  305.                     if ((im->Code & 0x80) == 0) {
  306.                         /*  Handled in command interpreter.
  307.                         if (Ep->iconmode) {
  308.                             uniconify();
  309.                             break;
  310.                         }
  311.                         */
  312.                         text_cursor(0);
  313.                         if(Ep->Replacemode)
  314.                            multireplace(im);
  315.                         else
  316.                            keyctl(im, im->Code, im->Qualifier);
  317.                         text_cursor(1);
  318.                     }
  319.                     break;
  320.                 case MENUPICK:
  321.                     {
  322.                         register char *str = menu_cmd(im);
  323.                         if (str) {
  324.                             str = strcpy(malloc(strlen(str)+1), str);
  325.                             text_cursor(0);
  326.                             do_command(str);
  327.                             free(str);
  328.                             text_cursor(1);
  329.                         }
  330.                     }
  331.                     break;
  332.                 case CLOSEWINDOW:
  333.                     if (Comlinemode)
  334.                         escapecomlinemode();
  335.                     text_sync();
  336.                     notdone = 0;
  337.                     break;
  338.                 case ACTIVEWINDOW:
  339.                     if (!Ep->iconmode)
  340.                         iawm = 1;
  341.                     break;
  342.                 case MOUSEMOVE:
  343.                     mmove = 1;
  344.                     mqual = im->Qualifier;
  345.                     break;
  346.                 }
  347.                 if (im)
  348.                     ReplyMsg(im);
  349.                 if (notdone == 0 || Quitflag) {
  350.                     dontwait = 2;
  351.                     goto boom;
  352.                 }
  353.                 if (gmess)
  354.                   break;
  355.             }
  356.         }
  357.  
  358.         iawm = 0;
  359.         if (gmess) {
  360.             if (Comlinemode)
  361.               escapecomlinemode();
  362.             Gad(gmess);
  363.             dontwait++;
  364.         }
  365.         if (mmove) {
  366.             uniconify();
  367.             mmove = 0;
  368.             text_cursor(0);
  369.             keyctl(NULL, QMOVE, mqual);
  370.             text_cursor(1);
  371.         }
  372.         closesharedwindow(NULL);
  373.     }
  374. boom:
  375.     text_sync();
  376.     if (Ep->Modified && !Overide) {
  377.         uniconify();
  378.         Overide = 1;
  379.         title("*** File has been modified ***");
  380.         Quitflag = 0;
  381.         goto loop;
  382.     }
  383.     SetWindowTitles(Win, "", -1);
  384. #if M2ERR
  385.     if(Ep->err_num)
  386.       err_quit();
  387. #endif
  388.     text_uninit();                        /* uninitialize text portion    */
  389.     closesharedwindow(Win);
  390.     if (((ED *)DBase.mlh_Head)->Node.mln_Succ) {
  391.         Quitflag = 0;
  392.         Win = Ep->Win;                    /* make arbitrary other window act. */
  393.         Rp = Win->RPort;
  394.         if (!Ep->iconmode)
  395.             set_window_params();
  396.         text_load();
  397.         MShowTitle = 0;
  398.         set_prop();
  399.         goto loop;
  400.     }
  401.     closesharedwindow(NULL);
  402.     if (Do)
  403.         FreeDiskObject(Do);
  404. #if AREXX
  405.     closerexx();
  406. #endif
  407.     UnLock(CurrentDir(origlock));
  408.     if (IPCPort)
  409.         CloseIPC(IPCPort);
  410.     if (IPCRPort)
  411.         DeletePort(IPCRPort);
  412.     if(Screen)
  413.         CloseScreen(Screen);
  414.     closelibs(-1);
  415.     dealloc_hash();
  416. }
  417.  
  418. ipchandler()
  419. {
  420.     register IPCMSG *msg;
  421.     register char *ptr;
  422.     while (msg = (IPCMSG *)GetMsg(IPCPort)) {
  423.         register long error = 0;
  424.         if (ptr = (char *)msg->TBuf) {      /*  Valid msg,  */
  425.             register ED *ed;
  426.                                             /*  For this project  */
  427.             if (ptr[0] == 0)
  428.                 ed = Ep;
  429.             else if ((ed = finded(ptr, 0)) == NULL)
  430.                 error = IF_NOTFND;
  431.             if (ed) {
  432.                 if (ed != Ep)
  433.                     text_switch(ed->Win);
  434.                 if (!Ep->iconmode)
  435.                     text_cursor(0);
  436.                 while (*ptr++);                 /*  Skip Project Name */
  437.                 do_command(ptr);
  438.             }
  439.         }
  440.         ReplyIPC(msg, NULL, 0, error);
  441.     }
  442. }
  443.  
  444. /*
  445.  *  If it is possible, create an IPC port for DME.  IF_ALLOC specifies that
  446.  *  incomming static messages should be re-allocated automatically because
  447.  *  we will be destroying the input buffer for messages we process.
  448.  */
  449.  
  450. initipc()
  451. {
  452.     if (openlibs(DRES_LIB)) {
  453.         if (IPCPort = OpenIPC("dme.CMD", IF_ALLOC)) {
  454.             Mask |= 1 << IPCPort->mp_SigBit;
  455.             IPCRPort = CreatePort(NULL,0);
  456.         }
  457.     }
  458. }
  459.  
  460. /*
  461.  *  IPC appname projname command
  462.  */
  463.  
  464. void
  465. do_ipc()
  466. {
  467.     char *buf;
  468.     char buf2[64];
  469.     IPCMSG msg;
  470.     short len;
  471.  
  472.     if (!IPCPort)
  473.         initipc();
  474.     if (!IPCPort) {
  475.         Abortcommand = 1;
  476.         title("dres.library not installed");
  477.         return;
  478.     }
  479.     buf = malloc(len = strlen(av[2])+strlen(av[3])+2);
  480.     strcpy(buf, av[2]);
  481.     strcpy(buf+strlen(buf)+1, av[3]);
  482.     strcpy(buf2, av[1]);
  483.     strcat(buf2, ".CMD");
  484.     msg.Msg.mn_ReplyPort = IPCRPort;
  485.     msg.TBuf = (APTR)buf;
  486.     msg.TLen = len;
  487.     msg.TFlags = IF_NOCOPY;
  488.     DoIPC2(buf2, &msg, ipchandler, IPCPort);
  489.     if (msg.RFlags & IF_ERROR) {
  490.         if (msg.RFlags & IF_NOAPP)
  491.             title("Application not found");
  492.         else
  493.             title("Remote error");
  494.     }
  495.     FreeIPC(&msg);
  496.     free(buf);
  497. }
  498.  
  499. do_iconify()
  500. {
  501.     text_sync();
  502.     if (!Comlinemode)
  503.         iconify();
  504. }
  505.  
  506. do_tomouse()
  507. {
  508.     text_position((Mx-Xbase)/Xsize, (My-Ybase)/Ysize);
  509. }
  510.  
  511. iconify()
  512. {
  513.     if (!Ep->iconmode) {
  514.         Ep->Winx      = Win->LeftEdge;
  515.         Ep->Winy      = Win->TopEdge;
  516.         Ep->Winwidth  = Win->Width;
  517.         Ep->Winheight = Win->Height;
  518.         Nw.Height = 10;
  519.         Nw.Width  = 20 + 5*8 + strlen(Ep->Name)*8;
  520.         Nw.LeftEdge= Ep->IWinx;
  521.         Nw.TopEdge = Ep->IWiny;
  522.         if (Nw.LeftEdge + Nw.Width > Win->WScreen->Width)
  523.             Nw.LeftEdge = Win->WScreen->Width - Nw.Width;
  524.         if (Nw.TopEdge + Nw.Height > Win->WScreen->Height)
  525.             Nw.TopEdge = Win->WScreen->Height - Nw.Height;
  526.         Nw.Title = Ep->Wtitle;
  527.         Nw.Flags &= ~(WINDOWSIZING|WINDOWDEPTH|ACTIVATE);
  528.         Nw.Flags |= BORDERLESS;
  529.         Nw.BlockPen = (Ep->Modified) ? 3 : -1;
  530.         sprintf(Ep->Wtitle, "%s     ", Ep->Name);
  531.         if (Win->Flags & WINDOWACTIVE)      /*  KTS */
  532.             Nw.Flags |= ACTIVATE;
  533.         closesharedwindow(Win);
  534.         Win = Ep->Win = opensharedwindow(&Nw);
  535.         Nw.BlockPen = -1;
  536.         Nw.Flags |= WINDOWSIZING|WINDOWDEPTH;
  537.         Nw.Flags &= ~BORDERLESS;
  538.         Rp = Win->RPort;
  539.     }
  540.     Ep->iconmode = 1;
  541. }
  542.  
  543. uniconify()
  544. {
  545.     if (Ep->iconmode) {
  546.         Ep->IWinx = Win->LeftEdge;
  547.         Ep->IWiny = Win->TopEdge;
  548.         closesharedwindow(Win);
  549.         Nw.LeftEdge = Ep->Winx;
  550.         Nw.TopEdge  = Ep->Winy;
  551.         Nw.Width    = Ep->Winwidth;
  552.         Nw.Height   = Ep->Winheight;
  553.         Nw.Title    = Ep->Wtitle;
  554.         Win = Ep->Win = opensharedwindow(&Nw);
  555.         menu_strip(Win);
  556.         Rp = Win->RPort;
  557.         if (Ep->Font)
  558.             SetFont(Rp, Ep->Font);
  559.         set_window_params();
  560.         if (!text_sync())
  561.             text_redisplay();
  562.         text_cursor(1);
  563.         MShowTitle = 0;
  564.         window_title();
  565.     }
  566.     Ep->iconmode = 0;
  567.     set_prop();
  568. }
  569.  
  570.  
  571. do_newwindow(makesmall, deltaheight)
  572. {
  573.     NS  ns;
  574.     WIN *win;
  575.     int msadj = makesmall;
  576.  
  577.     if(ScreenDepth && !Screen) {
  578.        if(ScreenDepth > 4)
  579.          ScreenDepth = 4;
  580.        bzero(&ns,sizeof(NS));
  581.        ns.Width = Nwwidth+Nwleftedge;
  582.        ns.Height = Nwheight+Nwtopedge;
  583.        ns.Depth = ScreenDepth;
  584.        ns.DetailPen = 0;
  585.        ns.BlockPen =  1;
  586.        if(ns.Height > 282)
  587.          ns.ViewModes = HIRES|INTERLACE;
  588.        else
  589.          ns.ViewModes = HIRES;
  590.        ns.Type = CUSTOMSCREEN;
  591.        ns.DefaultTitle = (UBYTE *) "DME V1.4";
  592.        Screen = OpenScreen(&ns);
  593.     }
  594.     if (SizeOveride)
  595.         msadj = 0;
  596.     if (Ep)
  597.         text_sync();
  598.     Nw.Title = (ubyte *)"    OK    ";
  599.     Nw.Width = (Nwtmpwidth) ? Nwtmpwidth : Nwwidth;
  600.     Nw.Height= (Nwtmpheight)? Nwtmpheight: Nwheight;
  601.     Nwtmpwidth = Nwtmpheight = 0;
  602.     Nw.LeftEdge = Nwleftedge;
  603.     Nw.TopEdge  = Nwtopedge;
  604.     if(ScreenDepth) {
  605.       Nw.Type = CUSTOMSCREEN;
  606.       Nw.Screen = Screen;
  607.     }
  608.     if (msadj > 0) {                    /* deltaheight must be valid    */
  609.         Nw.TopEdge = deltaheight + 16;
  610.         Nw.LeftEdge= 10*8;
  611.         Nw.Flags &= ~ACTIVATE;
  612.         Nw.Width = 40*8;
  613.         Nw.Height= 10*8;
  614.         if (Nw.TopEdge + Nw.Height > 200)
  615.             Nw.TopEdge = deltaheight = 200 - Nw.Height;
  616.     }
  617.     win = opensharedwindow(&Nw);
  618.     menu_strip(win);
  619.     Nw.Flags |= ACTIVATE;
  620.     if (win) {
  621.         Win = win;                      /* set new window   */
  622.         Rp = Win->RPort;
  623.         set_window_params();
  624.         text_init();                    /* initialize       */
  625.         text_load();
  626.         if (makesmall != -1)            /* if deltaheight valid */
  627.             Ep->IWiny = deltaheight + 16;
  628.     }
  629.     set_prop();
  630. }
  631.  
  632. WIN *
  633. TOpenWindow(nw)
  634. NW *nw;
  635. {
  636.     WIN *win;
  637.  
  638.     while ((win = OpenWindow(nw)) == NULL) {
  639.         if (nw->Width < 50 || nw->Height < 50)
  640.             break;
  641.         nw->Width -= 10;
  642.         nw->Height-= 10;
  643.     }
  644.     return(win);
  645. }
  646.  
  647.  
  648. WIN *
  649. opensharedwindow(nw)
  650. NW *nw;
  651. {
  652.     WIN *win;
  653.  
  654.     if (Sharedport)
  655.         nw->IDCMPFlags = NULL;
  656.     else
  657.         nw->IDCMPFlags = IDCMPFLAGS;
  658.     win = TOpenWindow(nw);
  659.     if (win) {
  660.         if (Sharedport) {
  661.             win->UserPort = Sharedport;
  662.             ModifyIDCMP(win, IDCMPFLAGS);
  663.         } else {
  664.             Sharedport = win->UserPort;
  665.         }
  666.         ++Sharedrefs;
  667.     }
  668.     return(win);
  669. }
  670.  
  671.  
  672. closesharedwindow(win)
  673. WIN *win;
  674. {
  675.     static WIN *wunlink;
  676.     register IMESS *im;
  677.     char notoktoclosenow = 0;
  678.  
  679.     if (win) {
  680.         SetWindowTitles(win, "", -1);
  681.         ClearMenuStrip(win);
  682.         Forbid();
  683.         win->UserPort = NULL;
  684.         ModifyIDCMP(win, GADGETUP);     /* NEVER occurs */
  685.  
  686.         notoktoclosenow = 1;
  687.  
  688.         Permit();
  689.         if (notoktoclosenow) {
  690.             win->UserData = (char *)wunlink;
  691.             wunlink = win;
  692.         } else {
  693.             CloseWindow(win);
  694.         }
  695.         --Sharedrefs;
  696.     } else {
  697.         if (Sharedrefs == 0 && Sharedport) {
  698.             DeletePort(Sharedport);
  699.             Sharedport = NULL;
  700.         }
  701.         for (win = wunlink; win; win = wunlink) {
  702.             wunlink = (WIN *)win->UserData;
  703.             CloseWindow(win);
  704.         }
  705.         wunlink = NULL;
  706.     }
  707. }
  708.  
  709.  
  710. getyn(text)
  711. char *text;
  712. {
  713.     int result;
  714.     ITEXT *body, *pos, *neg;
  715.  
  716.     body = (ITEXT *)AllocMem(sizeof(ITEXT), 0);
  717.     pos  = (ITEXT *)AllocMem(sizeof(ITEXT), 0);
  718.     neg  = (ITEXT *)AllocMem(sizeof(ITEXT), 0);
  719.     bzero(body, sizeof(ITEXT));
  720.     bzero(pos , sizeof(ITEXT));
  721.     bzero(neg , sizeof(ITEXT));
  722.     body->BackPen = pos->BackPen = neg->BackPen = 1;
  723.     body->DrawMode= pos->DrawMode= neg->DrawMode= AUTODRAWMODE;
  724.     body->LeftEdge = 10;
  725.     body->TopEdge  = 12;
  726.     body->IText    = (ubyte *)text;
  727.     pos->LeftEdge = AUTOLEFTEDGE;
  728.     pos->TopEdge = AUTOTOPEDGE;
  729.     pos->IText = (ubyte *)"OK";
  730.     neg->LeftEdge = AUTOLEFTEDGE;
  731.     neg->TopEdge = AUTOTOPEDGE;
  732.     neg->IText = (ubyte *)"CANCEL";
  733.     result = AutoRequest(Win,body,pos,neg,0,0,320,58);
  734.     FreeMem(body, sizeof(ITEXT));
  735.     FreeMem(pos , sizeof(ITEXT));
  736.     FreeMem(neg , sizeof(ITEXT));
  737.     return(result);
  738. }
  739.  
  740.  
  741. title(buf)
  742. char *buf;
  743. {
  744.     SetWindowTitles(Win, buf, -1);
  745.     Oldtlen = 999;
  746.     MShowTitle = 3;
  747. }
  748.  
  749. window_title()
  750. {
  751.     register int len, maxlen;
  752.  
  753.     if (memoryfail) {
  754.         title(" -- NO MEMORY -- ");
  755.         memoryfail = 0;
  756.         text_redisplay();
  757.     }
  758.     if (MForceTitle) {
  759.         MShowTitle = 0;
  760.         MForceTitle = 0;
  761.     }
  762.     if (MShowTitle) {
  763.         --MShowTitle;
  764.         return(0);
  765.     }
  766.     {
  767.         register char *mod;
  768.         FONT *oldfont;
  769.  
  770.         mod = (Ep->Modified) ? " (modified)" : "          ";
  771.         sprintf(Ep->Wtitle, "%3ld/%-3ld %3ld %s%s  ", text_lineno(), text_lines(), text_colno()+1, text_name(), mod);
  772.         if (!text_imode())
  773.             strcat(Ep->Wtitle, "Ovr ");
  774.         len = strlen(Ep->Wtitle);
  775.         if (len < Columns && Columns < 128) {
  776.             bset(Ep->Wtitle+len, Columns - len + 1, ' ');
  777.             Ep->Wtitle[Columns + 1] = 0;
  778.         }
  779.  
  780.         /*
  781.          *  Update title
  782.          */
  783.  
  784.         oldfont = Win->RPort->Font;
  785.         SetFont(Win->RPort, Win->WScreen->RastPort.Font);
  786.  
  787.         Win->Title = Ep->Wtitle;
  788.         SetAPen(Rp, 0);
  789.         SetBPen(Rp, 1);
  790.         Move(Rp, 30, Win->RPort->Font->tf_Baseline+1);
  791.         maxlen = (Win->Width-96)/Win->RPort->Font->tf_XSize;
  792.         if (maxlen < 0)
  793.             maxlen = 0;
  794.         if (len > maxlen)
  795.             len = Oldtlen = maxlen;
  796.         if (Oldtlen > maxlen)
  797.             Oldtlen = maxlen;
  798.         Text(Rp, Ep->Wtitle, len);      /*  No flash                    */
  799.         while (Oldtlen - len >= (int)sizeof(Space)) {
  800.             Text(Rp, Space, sizeof(Space));
  801.             Oldtlen -= sizeof(Space);
  802.         }
  803.         if (Oldtlen - len > 0)
  804.             Text(Rp, Space, Oldtlen - len);
  805.         Oldtlen = len;                  /*  Oldtlen might have been <   */
  806.         SetAPen(Rp, 1);
  807.         SetBPen(Rp, 0);
  808.  
  809.         SetFont(Win->RPort, oldfont);
  810.     }
  811. }
  812.  
  813. set_window_params()
  814. {
  815.     Xsize = Rp->Font->tf_XSize;
  816.     Ysize = Rp->Font->tf_YSize;
  817.     Xbase = Win->BorderLeft;
  818.     Ybase = Win->BorderTop;
  819.     Xpixs   = Win->Width - Win->BorderRight - Xbase;
  820.     Ypixs   = Win->Height- Win->BorderBottom- Ybase;
  821.     Columns = Xpixs / Xsize;
  822.     Rows    = Ypixs / Ysize;
  823.     XTbase  =  Xbase;
  824.     YTbase  =  Ybase + Rp->Font->tf_Baseline;
  825.     set_prop();
  826. }
  827.  
  828.  
  829. exiterr(str)
  830. char *str;
  831. {
  832.     if (Output()) {
  833.         Write(Output(),str,strlen(str));
  834.         Write(Output(),"\n",1);
  835.     }
  836.     exit(1);
  837. }
  838.  
  839.  
  840. /*
  841.  *  Check break by scanning pending messages in the I stream for a ^C.
  842.  *  Msgchk forces a check, else the check is only made if the signal is
  843.  *  set in the I stream (the signal is reset).
  844.  */
  845.  
  846. breakcheck()
  847. {
  848.     IMESS *im;
  849.     register struct List *list = &Win->UserPort->mp_MsgList;
  850.  
  851.     if (Msgchk || (SetSignal(0,0) & (1<<Win->UserPort->mp_SigBit))) {
  852.         Msgchk = 0;
  853.         SetSignal(0,1<<Win->UserPort->mp_SigBit);
  854.  
  855.         im = (IMESS *)list->lh_Head;
  856.         Forbid();
  857.         for (; im != &list->lh_Tail; im = (IMESS *)im->ExecMessage.mn_Node.ln_Succ) {
  858.             if (im->Class == RAWKEY && (im->Qualifier & 0xFB) == 0x08 &&
  859.                 im->Code == CtlC) {
  860.  
  861.                 Permit();
  862.                 SetSignal(SIGBREAKF_CTRL_C,SIGBREAKF_CTRL_C);
  863.                 return(1);
  864.             }
  865.         }
  866.         Permit();
  867.     }
  868.     return(0);
  869. }
  870.  
  871. breakreset()
  872. {
  873.     SetSignal(0, SIGBREAKF_CTRL_C);
  874. }
  875.  
  876. /*
  877.  *  leftedge n
  878.  *  topedge  n
  879.  *  width    n
  880.  *  height   n
  881.  *  tmpwidth  n
  882.  *  tmpheight n
  883.  */
  884.  
  885. void
  886. do_windowparm()
  887. {
  888.     int val = atoi(av[1]);
  889.  
  890.     if (av[0][0] == 't' && av[0][1] == 'm') {   /*  tmpwidth/tmpheight  */
  891.         if (av[0][3] == 'w')
  892.             Nwtmpwidth = val;
  893.         if (av[0][3] == 'h')
  894.             Nwtmpheight= val;
  895.         return;
  896.     }
  897.     switch(av[0][0]) {
  898.     case 'l':
  899.         Nwleftedge = val;
  900.         break;
  901.     case 't':
  902.         Nwtopedge = val;
  903.         break;
  904.     case 'w':
  905.         Nwwidth = val;
  906.         break;
  907.     case 'h':
  908.         Nwheight = val;
  909.         break;
  910.     }
  911. }
  912.  
  913. /*
  914.  *  resize cols rows
  915.  */
  916.  
  917. do_resize()
  918. {
  919.     int cols = atoi(av[1]);
  920.     int rows = atoi(av[2]);
  921.     short width = (cols*Win->RPort->Font->tf_XSize) + Win->BorderLeft + Win->BorderRight;
  922.     short height= (rows*Win->RPort->Font->tf_YSize) + Win->BorderTop + Win->BorderBottom;
  923.  
  924.     if (width < 16 || height < 16 ||
  925.     width > Win->WScreen->Width - Win->LeftEdge ||
  926.     height > Win->WScreen->Height - Win->TopEdge) {
  927.         title ("window too big (try moving to upper left corner and retrying)");
  928.         return(0);
  929.     }
  930.     SizeWindow(Win, width - Win->Width, height - Win->Height);
  931.     set_prop();
  932.     Delay(50*2);    /* wait 2 seconds */
  933. }
  934.  
  935. ops(av, iswb)
  936. register char *av[];
  937. {
  938.     register short nonops;
  939.     register short i;
  940.     register long val;
  941.     register char *str;
  942.  
  943.     for (i = nonops = 0; str = av[i]; ++i) {
  944.         if (iswb) {
  945.             if (strncmp(str, "ARG", 3) == 0) {
  946.                 while (*str && *str != '-')
  947.                     ++str;
  948.             }
  949.         }
  950.         if (*str == '-') {
  951.             val = atoi(str+2);
  952.             switch(str[1]) {
  953.             case 'f':
  954.                 Ffile = str+2;
  955.                 break;
  956.             case 'b':
  957.                 SizeOveride = 1;
  958.                 break;
  959.             case 't':
  960.                 Nwtopedge = val;
  961.                 break;
  962.             case 'l':
  963.                 Nwleftedge= val;
  964.                 break;
  965.             case 'w':
  966.                 SizeOveride = 1;
  967.                 Nwwidth   = val;
  968.                 break;
  969.             case 'h':
  970.                 SizeOveride = 1;
  971.                 Nwheight  = val;
  972.                 break;
  973.             case 's':
  974.                 ScreenDepth = val;
  975.                 break;
  976.             }
  977.         } else {
  978.             ++nonops;
  979.         }
  980.     }
  981.     return(nonops);
  982. }
  983.